--[[ 武装飞鸟2脚本,不同人物判定和蓄力等级不同,以隐藏人物为准,显示中心和参考线,
  左下显示火力,蓄力等级不同时参考线颜色不同.
  
  数据简洁又跟s1945ii很相似.
  使用了刚刚更新的库
  
  By setycyas @2025-02-10
]]

--防止重复运行
if (_G.game) then
  print('script already loaded!')
  return
end

local myMame = require('MyMame')
local myStg = require('MySTG')

-- 这里设定基本参数
local GAME = {
  -- 游戏名,防重加载用
  NAME = "gunbird2_autoboot",
  -- 分辨率
  Y_RESOLUTION = 224.0,
  X_RESOLUTION = 320.0,
  -- Y坐标只需要低位,X坐标用read_u16读取,需要从高位读起
  Y_ADDR = 0x06055011,
  X_ADDR = 0x06055014,
  -- 火力与蓄力地址
  POW_ADDR = 0x0605505b,
  CHARGE_ADDR = 0x06055074,
  -- 中心显示方块的宽和高,单位为像素,但WIDTH对应的是X
  BOX_WIDTH = 5,
  BOX_HEIGHT = 4,
  -- 中心方块的边框颜色和中心颜色
  BOX_BORDER_COLOR = 0xDDff0000,
  BOX_COLOR = 0x88ff0000,
  -- 像素平移
  X_OFFSET = 0,
  Y_OFFSET = -0.5,
  -- 十字框长度
  CROSS_X_LENGTH = 30,
  CROSS_Y_LENGTH = 20,
  -- 蓄力情况不同的颜色
  CHARGE_COLOR0 = 0xAAaaaaaa,
  CHARGE_COLOR1 = 0xAA00ff00,
  CHARGE_COLOR2 = 0xAADfd700,
  -- 蓄力等级需要的数值,貌似不同人物不同,这里用了隐藏人物(密码51024,随机人物按"下")的数据
  CHARGE_LV1 = 0x288,
  CHARGE_LV2 = 0x1700,
}
-- 更新一下模块的参数
myMame.gameName = GAME.NAME
myMame.screenIndex = ':screen'
myStg.screenIndex = ':screen'
myStg.X_RESOLUTION = GAME.X_RESOLUTION
myStg.Y_RESOLUTION = GAME.Y_RESOLUTION

-- 获取坐标,返回整数
function GAME.getY()
  local ylow
  ylow = myMame.mem:read_u8(GAME.Y_ADDR)
  return ylow+GAME.Y_OFFSET
end
function GAME.getX()
  local xword -- 2字节所以叫word
  xword = myMame.mem:read_u16(GAME.X_ADDR)
  return xword+GAME.X_OFFSET
end

-- 监视各地址,测试时用投入使用时不显示
function GAME.watchAddrs()
  local addrArr, strArr
  addrArr = {
    GAME.CHARGE_ADDR, GAME.CHARGE_ADDR+1
  }
  strArr = myMame.readAddrArr(addrArr)
  myMame.showInfo(strArr)
end

-- 显示监视的数据
function GAME.check()
  local power
  power = myMame.mem:read_u8(GAME.POW_ADDR)
  myMame.container:draw_text(0, 0, "P="..power, 0xFF005500, 0xFFcccccc)
  end

-- 显示辅助线
function GAME.showAssist()
  myMame.ui_container:draw_box(0.495, 1.0, 0.505, 0.97, 0xDDdd00dd, 0xDDdd00dd)
end

-- 显示方块,x,y是整数坐标
function GAME.showSqua(x, y)
  local charge, chargeColor
  charge = myMame.mem:read_u16(GAME.CHARGE_ADDR)
  -- 根据蓄力情况获取颜色
  if (charge < GAME.CHARGE_LV1) then
    chargeColor = GAME.CHARGE_COLOR0
  elseif (charge < GAME.CHARGE_LV2) then
    chargeColor = GAME.CHARGE_COLOR1
  else
    chargeColor = GAME.CHARGE_COLOR2
  end
    
  if (x > 0) and (y > 0) then
    -- 中心参考线
    myStg.xLine(x, chargeColor, 1.5)
    myStg.yLine(y, chargeColor, 1.5)
    
    --[[
    myStg.centerBox(x, y, GAME.X_RESOLUTION, GAME.BOX_HEIGHT, chargeColor, 0x0)
    myStg.centerBox(x, y, GAME.BOX_WIDTH, GAME.Y_RESOLUTION, chargeColor, 0x0)
    ]]
    
    --[[ 十字框
    myStg.centerBox(x, y, GAME.CROSS_X_LENGTH, GAME.BOX_HEIGHT, chargeColor)
    myStg.centerBox(x, y, GAME.BOX_WIDTH, GAME.CROSS_Y_LENGTH, chargeColor)
    ]]
    -- 中心
    myStg.centerBox(
      x, y,
      GAME.BOX_WIDTH, GAME.BOX_HEIGHT,
      GAME.BOX_BORDER_COLOR, GAME.BOX_COLOR
    )
  end
  
end

-- 主函数,绑定后每一帧执行一次该函数
function GAME.Main()
  local x, y
  
  x = GAME.getX()
  y = GAME.getY()
  
  -- 监视数据
  --GAME.watchAddrs()
  -- 辅助线
  GAME.showAssist()
  -- 数据监视
  GAME.check()
  -- 显示角色中心方块
  GAME.showSqua(x, y)

end

-- [[运行]]

-- 绑定每一帧执行的函数
--myMame.debugRunPerFrame(GAME.Main, 'gunbird2')
myMame.runPerFrame(GAME.Main, 'gunbird2')
-- 导出到全局变量
_G.game = GAME

return GAME
